手動コピーしたS3オブジェクトを削除したとき、削除マーカーがレプリーションされるのか試してみた
クロスリージョンレプリケーションで既存のオブジェクトをレプリケーション先のバケットに手動でコピーしたあと、レプリケーション元オブジェクトを削除したときに削除マーカーがレプリケートされるのか気になったので確認してみます。
何をするのか
backet-A(東京)ではオブジェクトを元々アップロードされている状態で、クロスリージョンレプリケーションでbacket-B(バージニア北部)に対してレプリケーションするようにルールを設定します。レプリケーションルールの設定を入れるだけでは既存のオブジェクトはレプリケートしてくれないため、手動で全てのオブジェクトをコピーしておきます。
コピーが完了したあと、bucket-Aのオブジェクトを削除したとき、bucket-Bでも削除マーカーがレプリケーションするのかを確認していきます。
削除マーカーとは
削除マーカーとはバージョニングされたバケット内で、オブジェクトを削除したように見せるための機能です。オブジェクトを削除すると、削除マーカーが作成されオブジェクトの最新バージョンとなります。このときオブジェクトを取得しようとしても404エラーとなり、コンソール上からも削除されているように見えます。
削除マーカーの使用 - Amazon Simple Storage Service
やってみた
今回は東京リージョン(レプリケーション元)とバージニア北部リージョン(レプリケーション先)にそれぞれバケットを作成して、レプリケーションルールを設定していきます。
S3バケットの作成
東京リージョン側でレプリケーション元のバケットtest-rep-bucket-ap-northeast-1
を作成。デフォルト暗号化はSSE-S3にして作成しました。
同じようにバージニア北部にtest-rep-bucket-us-east-1
という名前でバケットを作成します。こちらも暗号化は同じくSSE-S3を設定します。レプリケーションの元と先バケットではバージョニングが必須なので有効化することを忘れないようにしましょう。
東京リージョンのレプリケーション元バケットには以下の階層のフォルダをアップロードしました。
test-folder ├── index.html └── scripts └── test.sh
レプリケーションルールの設定
東京リージョンのバケットから[管理]-[レプリケーションルールの作成]から作成していきます。
今回確認したいと思っていた「削除マーカーのレプリケーション」にチェックを入れて保存します。デフォルトでは削除マーカーはレプリケーションされないようになっていますので注意しましょう。
これでS3側の設定は完了です。
既存オブジェクトのコピー
あらかじめレプリケーション元に保存してあったオブジェクトは、レプリケーションルールを設定しただけでは自動でレプリケートしてくれないので、手動でコピーしてあげる必要があります。
一応サポートケースを起票することでAWSにお願いすることはできるらしいのですが、今回は手動コピーした場合の動きを確認していきます。サポートケースを起票したい場合は以下のエントリをご参照下さい。
いつの間に!?既存オブジェクトを S3 レプリケーション出来るようになっていた! | DevelopersIO
手動でコピーするために以下のコマンドでバージニア北部リージョンへ全てのオブジェクトをコピーします。
$ aws s3 sync s3://test-rep-bucket-ap-northeast-1 s3://test-rep-bucket-us-east-1 copy: s3://test-rep-bucket-ap-northeast-1/test-folder/index.html to s3://test-rep-bucket-us-east-1/test-folder/index.html copy: s3://test-rep-bucket-ap-northeast-1/test-folder/scripts/test.sh to s3://test-rep-bucket-us-east-1/test-folder/scripts/test.sh
test-rep-bucket-us-east-1
のバケットへコピーしたので、コンソールで確認してみると問題なくコピーできていますね。
削除マーカーのレプリケーション確認
それでは準備が整ったので、東京リージョンのバケットから試しにindex.html
を削除してみます。ここでバージニア北部のバケットでも同じようにオブジェクトが見えなくなるのかを確認しましょう。
削除マーカーがバージニア北部側のバケットでも反映されているかを確認してみると、index.html
がコンソールから見えなくなっていますね。反映されるまでは数十秒くらいだったと思います。
バージョンを表示してみると、index.htmlに削除マーカーが反映されていることを確認できました
まとめ
結論としては、手動でコピーしたオブジェクトに対しても削除マーカーがレプリケートされました。同じパスに対して削除マーカーをレプリケートしているだけなので、予想通りではあったのですが、単純にレプリケーションされているオブジェクトと差がないとも言えなかったので確認してみました。既存のバケットにレプリケーションルールを追加する際には、削除マーカーの扱いについても検討してみて下さい。